/**
 * 函数是JavaScript应用程序的基础。 它帮助你实现抽象层，模拟类，信息隐藏和模
 * 块。 在TypeScript里，虽然已经支持类，命名空间和模块，但函数仍然是主要的定
 * 义行为的地方。 TypeScript为JavaScript函数添加了额外的功能，让我们可以更容
 * 易地使用
 */

// 函数类型
function add(x: number, y: number): string {
  return `${x}+${y} = ${x + y}`
}
// console.log(add(5, 6));

//  推断类型
let myAdd = function (x: number, y: number): number { return x + y }
// console.log(myAdd(5, 6));

// 可选参数和默认参数
let myAdd2 = function (x: number, y?: number, z: number = 5): number {
  if (!y) y = 2
  return x + y + z;
}
// console.log(myAdd2(5));

// 剩余参数
let myApp3 = function (x: number, ...value: number[]) {
  return value;
}
// console.log(myApp3(5, 6, 7, 8, 9));

// this的使用 
interface Card {
  suit: string;
  card: number;
}
interface Deck {
  suits: string[];
  cards: number[];
  createCardPicker(this: Deck): () => Card;
}
let deck: Deck = {
  suits: ["hearts", "spades", "clubs", "diamonds"],
  cards: Array(52),
  // NOTE: The function now explicitly specifies that its callee must be of type Deck
  createCardPicker: function (this: Deck) {
    return () => {
      let pickedCard = Math.floor(Math.random() * 52);
      let pickedSuit = Math.floor(pickedCard / 13);

      return { suit: this.suits[pickedSuit], card: pickedCard % 13 };
    }
  }
}

let cardPicker = deck.createCardPicker();
let pickedCard = cardPicker();

console.log("card: " + pickedCard.card + " of " + pickedCard.suit);
